Objective-C 类目和延展

版权说明:本文为原创文章,未经允许,不得转载。

类目 (Category)

1.基本概念

当需要在一个已封装的类中添加方法时,可以不在该类中做修改或定义一个子类,只需在用到该方法时,添加一个该类的类目(category)即可。

· 在类目中定义的方法,会成为原始类的一部分,与其他方法的调用没有区别。
· 通过给父类定义类目方法,其子类也会继承这些方法。

2.类目的应用

· 对现有的类进行扩展。
· 作为子类的替代手段:不需要定义和使用一个子类,可以通过类目向已有的类里增加方法。
· 对类中的方法归类:利用category把一个庞大的类划分成小块来分别进行开发,从而更好的对类中的方法进行更新和维护。

3.类目的局限性

· 无法向类目中添加新的实例变量,类目没有位置来容纳实例变量,如果想增加类的实例变量,只能通过子类的方式。
· 若在类目中覆盖现有的类的方法,会引起super消息的断裂,因为类目中的方法具有更高的优先级,因此,一般不要覆盖现有类中的方法。

4.类目的定义及使用

类目的命名规则为:需添加类目的类名(类目名)

类目的接口声明与类的定义十分相似,但类目不继承父类,只需要带有一个括号,表示该类目的主要用途。

例如,如果需要对NSString类添加一个类目 Revert,则,文件名为:

NSString+Revert.h
NSString+Revert.m

代码分别为:

NSString+Revert.h:

@interface NSString (Revert)

- (void) test;

@end

NSString+Revert.m:

@implementation NSString (Revert)

- (void) test{
    //code
}

@end

延展 (Extension)

1.延展的基本概念

有时,一个类的某个方法只需要自己可见,可以通过延展的方法定义类的私有方法。类的延展就如同“匿名”的类目,延展中声明的方法在类本身的@implementation和它对应的@end之间实现。

2.延展的使用

延展的声明和实现均写在类的 .m 文件中,如下代码所示:

· 延展的声明

@interence Person ()

- (void)setName;

@end

· 延展的实现

@implementation Person

- (void)private{
    //code
}

@end